/**
 * 观察对象的所有属性
 * @param {*} obj 
 */
function observe(obj) {
    for (const key in obj) {
        if (Object.prototype.hasOwnProperty.call(obj, key)) {
            let internalValue = obj[key];
            if (typeof internalValue === 'object') {
                observe(internalValue)
                return;
            }
            let funcs = new Set() // 存储依赖;
            Object.defineProperty(obj, key, {
                get: () => {
                    // 依赖收集，记录：哪个函数在用我
                    if (window.__func && typeof window.__func === 'function') funcs.add(window.__func)
                    return internalValue
                },
                set: (value) => {
                    if (typeof value === 'object') {
                        observe(value)
                        return;
                    }
                    if (internalValue === value) return;
                    internalValue = value
                    // 派发更新，运行：执行用我的函数
                    funcs.forEach(fn => fn())
                }
            })
        }
    }
}

/**
 * 自动运行函数
 * @param {Array|Function} funcs 
 */
function autoRun(funcs) {
    if (Array.isArray(funcs)) {
        funcs.forEach(fn => {
            autoRun(fn)
        })
    }
    if (typeof funcs === 'function') {
        window.__func = funcs
        funcs()
        window.__func = null
    }
}
